package com.english.controller;

import com.english.entity.Banner;
import com.english.service.BannerService;
import com.english.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * 轮播图控制器
 * 提供轮播图的增删改查接口
 *
 * @author wlq
 * @since 2025-08-05
 */
@RestController
@RequestMapping("/api/banner")
@CrossOrigin(origins = "*", allowCredentials = "false", maxAge = 3600)
public class BannerController {

    @Autowired
    private BannerService bannerService;

    /**
     * 获取所有上架的轮播图（小程序端调用）
     * 
     * @return 轮播图列表
     */
    @GetMapping("/list")
    public R<List<Banner>> getActiveBanners() {
        try {
            List<Banner> banners = bannerService.getActiveBanners();
            return R.success("获取轮播图成功", banners);
        } catch (Exception e) {
            return R.error("获取轮播图失败：" + e.getMessage());
        }
    }

    /**
     * 获取所有轮播图（管理端调用）
     * 
     * @return 轮播图列表
     */
    @GetMapping("/all")
    public R<List<Banner>> getAllBanners() {
        try {
            List<Banner> banners = bannerService.list();
            return R.success("获取所有轮播图成功", banners);
        } catch (Exception e) {
            return R.error("获取所有轮播图失败：" + e.getMessage());
        }
    }

    /**
     * 根据ID获取轮播图详情
     * 
     * @param id 轮播图ID
     * @return 轮播图详情
     */
    @GetMapping("/{id}")
    public R<Banner> getBannerById(@PathVariable Long id) {
        try {
            Banner banner = bannerService.getById(id);
            if (banner != null) {
                return R.success("获取轮播图详情成功", banner);
            } else {
                return R.notFound("轮播图不存在");
            }
        } catch (Exception e) {
            return R.error("获取轮播图详情失败：" + e.getMessage());
        }
    }

    /**
     * 更新轮播图
     * 
     * @param id 轮播图ID
     * @param banner 轮播图信息
     * @return 操作结果
     */
    @PutMapping("/update/{id}")
    public R<String> updateBanner(@PathVariable Long id, @RequestBody Banner banner) {
        try {
            // 验证必填字段
            if (banner.getImageUrl() == null || banner.getImageUrl().trim().isEmpty()) {
                return R.badRequest("图片URL不能为空");
            }
            if (banner.getSortOrder() == null) {
                return R.badRequest("排序顺序不能为空");
            }

            banner.setId(id);
            boolean success = bannerService.updateBanner(banner);
            if (success) {
                return R.success("更新轮播图成功");
            } else {
                return R.error("更新轮播图失败");
            }
        } catch (Exception e) {
            return R.error("更新轮播图失败：" + e.getMessage());
        }
    }

    /**
     * 删除轮播图
     * 
     * @param id 轮播图ID
     * @return 操作结果
     */
    @DeleteMapping("/delete/{id}")
    public R<String> deleteBanner(@PathVariable Long id) {
        try {
            // 获取轮播图信息
            Banner banner = bannerService.getById(id);
            if (banner == null) {
                return R.notFound("轮播图不存在");
            }

            // 删除物理文件
            if (banner.getImageUrl() != null && !banner.getImageUrl().isEmpty()) {
                try {
                    String uploadDir = "uploads/banner/";
                    String fileName = banner.getImageUrl().substring(banner.getImageUrl().lastIndexOf("/") + 1);
                    Path filePath = Paths.get(uploadDir, fileName);
                    Files.deleteIfExists(filePath);
                } catch (IOException e) {
                    // 文件删除失败不影响数据库删除
                    System.err.println("删除文件失败：" + e.getMessage());
                }
            }

            boolean success = bannerService.deleteBanner(id);
            if (success) {
                return R.success("删除轮播图成功");
            } else {
                return R.error("删除轮播图失败");
            }
        } catch (Exception e) {
            return R.error("删除轮播图失败：" + e.getMessage());
        }
    }

    /**
     * 上架/下架轮播图
     * 
     * @param id 轮播图ID
     * @return 操作结果
     */
    @PutMapping("/toggle/{id}")
    public R<String> toggleBannerStatus(@PathVariable Long id) {
        try {
            boolean success = bannerService.toggleBannerStatus(id);
            if (success) {
                return R.success("切换轮播图状态成功");
            } else {
                return R.error("切换轮播图状态失败");
            }
        } catch (Exception e) {
            return R.error("切换轮播图状态失败：" + e.getMessage());
        }
    }
} 